リモート開発 シークレット どうする
概ねリモートホストで開発するという行為そのものをやめたほうがいいらしいです
ローカルで開発する場合でもセキュアストレージに頼らずにクレデンシャルを扱うにはどうしたらいいかという方向性自体は有用なのだが……
基本戦略
短命(<12h)なトークンを取得してキャッシュする
可能ならメモリ上,短命なのでファイルに置くのでも可
ホスト環境のブラウザは使えない(セッションが無い)のでゲストのブラウザを使いたい
ホストでサーバーを立てる OAuth2 の auth code flow は使えない
Device Flow を使いたいところ
Git
git-credential-manager を使ってトークンを取得する
署名
SSH Agent や GPG Agent を持っていけるならそれを使えばいい
それが無い場合は……
落とし穴
secretservice requires graphical sessions...
git-credential-manager を使ってると起こりがち
GNOME Keyring はグラフィックセッションがあることを前提にしている
復号がグラフィックセッションと紐付いているため
解決策
実は git-credential-manager は Git 標準の cache store が使えるのでそれを使う
GCM_CREDENTIAL_STORE=cache
GCM_CREDENTIAL_CACHE_OPTIONSでオプションも指定できる
file store とかもあるが,GitHub の吐き出すトークンの有効期限が長すぎるので使うべきではない
メモリに保持して確実に破棄してくれる cache store を使おう
ゲストマシンで GUI が開く
GUI のあるゲストマシンでやっている場合こちらからは操作できない GUI プロンプトが開いたりブラウザを開かれたりして破滅する
OAuth2 Device Flow を使わせる & GUI プロンプトを無効化する
GCM_GUI_PROMPT=0で GUI プロンプトを開かせないように
Device Flow を使わせる
GCM_GITHUB_AUTHMODES=device
残念ながら GitHub しかサポートしてないので他のやつらは諦めるほかない
Google Cloud
gcloud auth login --no-browserで動く
他の端末でログイン動作を実行してその auth code + α を受け取らせ,それをコピペで貼り付けて人間にプロキシさせるという,OOB authcode を形だけ回避したみたいなすごい実装になっている
あんまり短命ではない
AWS
aws sso login
Kubernetes
OIDC をサポートしているので,int128/kubelogin の --grant-type=device-codeでいける
1Password
たすけてー(泣)
op コマンドは存在するならホストの 1password アプリに接続しようとする
ホストで GUI で確認プロンプトが出て死ぬ
別の接続方法として 1Password Connect があるが……
OP_CONNECT_TOKENがおそらく短命ではなく,手軽な取得手段がない
GitHub Actions とか Terraform Cloud とか AWS とかからもっと真面目に扱いたいぜ!みたいな要求から OIDC での認証がサポートされてくれたりしたら,うれしい
もしかしたら Connect Server の前段に JWT Auth を有効にした Envoy とかを置いてしまって,実質的な認証はこっちでやってしまえばいいのかもしれない
SSH
SSH Agent が使えるならそれで
使えないなら……
1. tailscale SSH を使う
Device flow ライクな認証によって接続できる
tailscaled の持つ SSH 実装が使われるため,たまに通信が壊れることがある
バイナリとかを流すと壊れがち
2. Cloudflare Access を使う
認証 + HTTP Proxy tunneling
なんかあんまり好きになれなかったんだよな
3. Short lived certificate でがんばる
https://developers.cloudflare.com/cloudflare-one/identity/users/short-lived-certificates/#configure-your-client-ssh-config このへんを自分で実装するといける
ID Token を受け取り,鍵と証明書を生成する認証サーバが必要
真面目にやろうとすると Audit Log とかが必要になって……